package 设计模式.创建型模式.单例模式;


/**
 * 创建步骤
 * 1、私有化构造器
 * 2、内部创建唯一实例
 * 3、外部访问唯一实例
 * 4、同步🔒
 */
public class Singleton{

    private static Singleton instance = null;  //单例懒汉式
    private static Singleton instance2 = new Singleton();//单例饿汉式

    private Singleton(){};

    //单例懒汉式，双重检测机制
    public  static Singleton getInstance(){
        if (instance == null){//若对象存在则不需要同步，提高并发
            synchronized(Singleton.class){//对 对象进行加锁
                if (instance == null){//若对象没有创建则需要创建
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
    //单例饿汉式、线程安全的
    public static Singleton getInstance2(){
        return instance2;
    }
}


/**
 * 上述方式还是不安全，上述同步方式在大多数情况下是安全的，但是不要忘记JVM指令重排
 * volatile + 双重检测机制
 */
class SingleTon2{
    private volatile SingleTon2 instance = null;
    private SingleTon2(){};
    public SingleTon2 getInstance(){
        if (null == instance){
            synchronized (SingleTon2.class){
                if (instance == null){
                    instance = new SingleTon2();

                }
            }
        }
        return instance;
    }
}

class TestSingleton{
    public static void main(String[] args) {

        Singleton instance = Singleton.getInstance2();
        Singleton instance2 = Singleton.getInstance2();
        System.out.println(instance == instance2);
    }
}


